package iface.aplicativo.apresentacao.controle;

import iface.aplicativo.excecao.MensagemException;
import iface.aplicativo.negocio.aps.ManterClientesFornecedoresAPS;
import iface.aplicativo.negocio.entidade.Endereco;
import iface.aplicativo.negocio.entidade.MeioComunicacao;
import iface.aplicativo.negocio.entidade.Pessoa;
import iface.aplicativo.util.BeanAbstrato;
import iface.arquitetura.comum.string.UtilString;
import iface.arquitetura.utilitario.ListaTO;

import java.io.Serializable;
import java.util.Collection;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@ManagedBean
@SessionScoped
public class ManterClientesFornecedoresBean extends BeanAbstrato implements
		Serializable {

	private static final long serialVersionUID = 4285899560377776076L;

	private Pessoa pessoa;
	private Pessoa pessoaAux;
	private boolean cadastroDespachante;
	private boolean telaLancamento;
	private boolean telaCadastroEntrada;
	private boolean telaVenderVeiculos;

	@ManagedProperty(value = "#{manterClientesFornecedoresAPS}")
	private ManterClientesFornecedoresAPS service;

	public void setService(ManterClientesFornecedoresAPS service) {
		this.service = service;
	}

	public Collection<Pessoa> getTodasPessoas() throws Exception {
		return this.service.getTodasPessoas();
	}

	public Collection<ListaTO> getTodasUfs() throws Exception {
		return this.service.consultarTodasUfs();
	}

	public Collection<ListaTO> getTodosEstadosCivis() throws Exception {
		return this.service.consultarTodosEstadosCivis();
	}

	public void salvarClienteFornecedor() throws Exception {

		try {
			this.getPessoa().setCpfCnpj("");
			if (!UtilString.isVazio(this.getPessoa().getCpf())) {
				this.getPessoa().setCpfCnpj(this.getPessoa().getCpf());
			} else if (!UtilString.isVazio(this.getPessoa().getCnpj())) {
				this.getPessoa().setCpfCnpj(this.getPessoa().getCnpj());
			}

			String msg = this.service.salvarClienteFornecedor(this.getPessoa());
			this.limparCampos();

			this.setMensagem(msg, MSG_TIPO_INFORMACAO, "");
		} catch (final MensagemException e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_AVISO, "");
		} catch (final Exception e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_ERRO, "");
		}
	}

	public void incluirClienteFornecedorModal() throws Exception {

		try {
			this.getPessoa().setCpfCnpj("");
			if (!UtilString.isVazio(this.getPessoa().getCpf())) {
				this.getPessoa().setCpfCnpj(this.getPessoa().getCpf());
			} else if (!UtilString.isVazio(this.getPessoa().getCnpj())) {
				this.getPessoa().setCpfCnpj(this.getPessoa().getCnpj());
			}

			String msg = this.service.salvarClienteFornecedor(this.getPessoa());

			HttpServletRequest req = (HttpServletRequest) FacesContext
					.getCurrentInstance().getExternalContext().getRequest();

			HttpSession session = req.getSession();

			if (this.isTelaCadastroEntrada()) {
				CadastrarEntradaBean cadastroEntradaBean = (CadastrarEntradaBean) session
						.getAttribute("cadastrarEntradaBean");
				if (this.getPessoa().isDespachante()) {
					cadastroEntradaBean.getEntradaVeiculo().setDespachante(
							this.getPessoa());
				} else {
					cadastroEntradaBean.getEntradaVeiculo().setFornecedor(
							this.getPessoa());
				}
			} else if (this.isTelaLancamento()) {
				ManterLancamentosBean manterLancamentoBean = (ManterLancamentosBean) session
						.getAttribute("manterLancamentosBean");
				manterLancamentoBean.getLancamento()
						.setPessoa(this.getPessoa());
			} else if (this.isTelaVenderVeiculos()) {
				VenderVeiculosBean venderVeiculosBean = (VenderVeiculosBean) session
						.getAttribute("venderVeiculosBean");
				venderVeiculosBean.getVendaVeiculo().setCliente(
						this.getPessoa());
			}

			this.limparCampos();

			this.setMensagem(msg, MSG_TIPO_INFORMACAO, "");
		} catch (final MensagemException e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_AVISO, "");
		} catch (final Exception e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_ERRO, "");
		}
	}

	public void excluirClienteFornecedor() throws Exception {

		try {
			String msg = this.service.excluirClienteFornecedor(this
					.getPessoaAux());

			this.limparCampos();

			this.setMensagem(msg, MSG_TIPO_INFORMACAO, "");
		} catch (final MensagemException e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_AVISO, "");
		} catch (final Exception e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_ERRO, "");
		}
	}

	public void limparCampos() {
		this.setPessoa(null);
		this.setPessoaAux(null);
		this.setTelaCadastroEntrada(false);
		this.setTelaLancamento(false);
	}

	public Pessoa getPessoa() {
		if (pessoa == null) {
			pessoa = new Pessoa();
			pessoa.setTipoPessoa("F");
			pessoa.setEndereco(new Endereco());
			pessoa.setMeioComunicacao(new MeioComunicacao());
		}

		if (!UtilString.isVazio(pessoa.getCpfCnpj())
				&& pessoa.getCpfCnpj().length() == 14) {
			pessoa.setCpf(pessoa.getCpfCnpj());
			pessoa.setTipoPessoa("F");
		} else if (!UtilString.isVazio(pessoa.getCpfCnpj())
				&& pessoa.getCpfCnpj().length() == 18) {
			pessoa.setCnpj(pessoa.getCpfCnpj());
			pessoa.setTipoPessoa("J");
		}

		return pessoa;
	}

	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}

	public Pessoa getPessoaAux() {
		if (pessoaAux == null) {
			pessoaAux = new Pessoa();
			pessoaAux.setEndereco(new Endereco());
			pessoaAux.setMeioComunicacao(new MeioComunicacao());
		}

		if (!UtilString.isVazio(pessoaAux.getCpfCnpj())
				&& pessoaAux.getCpfCnpj().length() == 14) {
			pessoaAux.setCpf(pessoaAux.getCpfCnpj());
			pessoaAux.setTipoPessoa("F");
		} else if (!UtilString.isVazio(pessoaAux.getCpfCnpj())
				&& pessoaAux.getCpfCnpj().length() == 18) {
			pessoaAux.setCnpj(pessoaAux.getCpfCnpj());
			pessoaAux.setTipoPessoa("J");
		}

		return pessoaAux;
	}

	public void setPessoaAux(Pessoa pessoaAux) {
		this.pessoaAux = pessoaAux;
	}

	public boolean isCadastroDespachante() {
		return cadastroDespachante;
	}

	public void setCadastroDespachante(boolean cadastroDespachante) {
		this.cadastroDespachante = cadastroDespachante;
	}

	public boolean isTelaLancamento() {
		return telaLancamento;
	}

	public void setTelaLancamento(boolean telaLancamento) {
		this.telaLancamento = telaLancamento;
	}

	public boolean isTelaCadastroEntrada() {
		return telaCadastroEntrada;
	}

	public void setTelaCadastroEntrada(boolean telaCadastroEntrada) {
		this.telaCadastroEntrada = telaCadastroEntrada;
	}

	public boolean isTelaVenderVeiculos() {
		return telaVenderVeiculos;
	}

	public void setTelaVenderVeiculos(boolean telaVenderVeiculos) {
		this.telaVenderVeiculos = telaVenderVeiculos;
	}

}
